import cv2 as cv
import numpy as np

img = cv.imread('cat.jpeg', 0)

# ---------------------------sobel算子--------------------------
# x方向的Sobel卷积
sobelx = cv.Sobel(img, cv.CV_16S, 1, 0) #图像，数据类型(int)，x方向，y方向。这里的1，0表示在x方向进行
# y方向的Sobel卷积
sobely = cv.Sobel(img, cv.CV_64F, 0, 1) #0,1表示在y方向进行

# 注意：sobelx = cv.Sobel(img, cv.CV_16S, 1, 0，-1)，最后一个参数-1表示
# 用Scharr算子代替Sobel算子.得到的结果会更加精确，大于0表示卷积核大小，默认是3

# 将数据类型转换为uint8，因为上面使用int，但是像素值只能是0-255，所以需要转换
abs_sobelx = cv.convertScaleAbs(sobelx)
abs_sobely = cv.convertScaleAbs(sobely)

# 合并x方向和y方向的结果
result = cv.addWeighted(abs_sobelx, 0.5, abs_sobely, 0.5, 0) 
#参数：x方向图像，x方向权重，y方向图像，y方向权重，0表示结果图像为灰度图像


cv.imshow('Original Image', img)
cv.imshow('result', result)
cv.waitKey(0)
cv.destroyAllWindows()